#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
#include <QMessageBox>
#include <QDataStream>
// #include <QTextCodec>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // ui->label->setMouseTracking(true);

    //需求: 有一个按钮move ,每一次点击按钮,图片就移动
    //需要要到update()函数，强制刷新窗口->然后会paintEvent函数会被自动调用
    x=20;
    connect(ui->pushButton,&QPushButton::clicked,this,[=](){
        update();
    });

    //给label控件安装鼠标事件拦截器
    ui->label->installEventFilter(this);

    //Qt读的方式
    connect(ui->selectFile,&QPushButton::clicked,this,[=](){
        QString filepath=QFileDialog::getOpenFileName(this,"请选择文件","d://");
        if(filepath.isEmpty()==true)
        {
            QMessageBox::warning(this,"警告","文件打开失败");
            return;
        }
        ui->lineEdit->setText(filepath);

        //打开文件
        QFile file(filepath);
        //指定打开方式
        bool a=file.open(QFile::ReadOnly);
        if(a==false)
        {
            QMessageBox::critical(this,"警告","文件打开失败");
            return;
        }
        //读文件;默认读取的文件格式是utf-8,也就是说如果你的txt文件是utf8格式的就正常显示 ,
        //如果是gbk格式的就会乱码
        //QT中读文件;默认读取的文件格式是utf-8,如果你是其他格式如gbk的话,显示的话就可能会显示乱码,
        //这时候我们需要转换 #include <QTextCodec>不过QT6不再支持这个类了,所以我们要用的话,需要引用QT5的,
        //在对应的.pro文件追加 QT += core5compat
        // QTextCodec * textcode = QTextCodec::codecForName( "gbk") ;
        // setText(textcode->toUnicode(array));
        //一次性读完
        QByteArray array= file.readAll();
        //如果采用一行一行读
        while(!file.atEnd())
        {
            array+=file.readLine();
        }
        ui->textEdit->setText(array);
        file.close();
    });


    //Qt写的方式--文本流
    QFile file;
    file.setFileName("Test.txt");

    file.open(QFile::Append | QFile::Text);//设置文件打开方式--这里Text是文本流
    file.write(QString("hello Qt:你好，Qt").toUtf8());//写入;

    //QT中的文件流
    //文本流 , 数据流(二进制)二进制文件,不依赖于操作平台
    // #include <QTextStream>   //操作基础数据类型:  int , float , string
    // #include <QDataStream>   //可以操作二进制类型: QImage  Qpoint  QRect ,不依赖于平台
    connect(ui->selectFile_2,&QPushButton::clicked,this,[=](){
        QString filepath=QFileDialog::getOpenFileName(this,"请选择文件","d://");
        if(filepath.isEmpty()==true)
        {
            QMessageBox::warning(this,"警告","文件打开失败");
            return;
        }
        ui->lineEdit_2->setText(filepath);

        //打开文件
        QFile file(filepath);
        //指定打开方式
        bool a=file.open(QFile::ReadOnly);
        if(a==false)
        {
            QMessageBox::critical(this,"警告","文件打开失败");
            return;
        }

        //与上面不同--这里使用流的方式
        //设置IO设备给流对象，后面基本就没file的事了，相当于把文件对象封装进了流对象中
        QTextStream qts(&file);
        //如果乱码
        qts.setEncoding(QStringConverter::System);
        //一次性读完
        QString str= qts.readAll();
        //如果采用一行一行读
        // while(!qts.atEnd())
        // {
        //     str+=qts.readLine();
        // }
        ui->textEdit_2->setText(str);
        file.close();
    });


    QDataStream qds;

}

Widget::~Widget()
{
    delete ui;
}


void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    x+=5;
    if(x>this->width())
    {
        x=0;
    }
/* 绘图设备除了用this指向当前窗口QWidget类，还有：QPixmap QImage QPicture QBitmap(黑白图片)
    QBitmap:是黑白图片，加载方式和Qpixmap一样，是QPixmap的子类
    QPimap---图片类，主要用来显示，它针对显示器做了特殊优化，依赖于平台的，只能在主线程中使用
             也就是说我们往往显示图片的话，它针对不同的平台做了显示优化，所以效果更好，选这个
    QImage---图片类，不依赖于平台，如果我们用到跨平台的图片传输，要用到这个，可以在多线程对其进行操作传输格式不变
    QPicture 在这个设备上画图，保存并不是图片，而是画图的步骤可以使用任何的扩展名 , 如果我们要画一个机密图 ,
                就可以采用这种方式,别人即使得到我们的文件,也不一定知道我们是用QT中的Qpicture绘画出来的.
*/
    p.drawPixmap(x,120,QPixmap(":/Image1/sunny.png"));
}

bool Widget::eventFilter(QObject *obj, QEvent *ev)
{
    //如果这里是多个控件都安装了拦截器则需要先判断是哪一个控件
    if(((mylabel*) obj)==ui->label)
    {
        if(ev->type()==QEvent::MouseMove)
        {
            return true;
        }
    }

    return QWidget::eventFilter(obj,ev);
}


// void Widget::paintEvent(QPaintEvent *)
// {
// 回调函数，不需要我们去调用，当刷新窗口的时候会自动调用
//     刷新窗口：
//      1：窗口显示的时候
//      2:最大化八最小化
//      3:窗口被遮挡，重新显示的时候
//      4:用户强制刷新的时候
//      5.。.
//     如果想使用画家类在窗口中画图，操作必须在paintEvent函数中完成
//     //创建画家类对象
//     QPainter p(this);// this指定是当前绘图窗口

//     //画家默认使用黑色画笔
//     //设置新画笔
//     QPen pen;
//     pen.setColor(QColor(250,120,110));
//     pen.setWidth(5);//设置笔的宽度
//     pen.setStyle(Qt::DashLine);//设置笔的类型,比如虚线，实线
//     p.setPen(pen);


//     //画笔的方式是操作边框的，如果需要改变里面的话需要用刷
//     // QBrush brush(Qt::yellow);
//     //当然也可以用图片填充
//     QBrush brush(QPixmap(":/Image1/face.png"));
//     p.setBrush(brush);


//     //画背景图
//     p.drawPixmap(QPoint(0,0),QPixmap(":/Image1/Frame.jpg"));

//     //画直线
//     p.drawLine(QPoint(100,100),QPoint(300,300));

//     //画椭圆
//     p.drawEllipse(QPoint(300,300),150,50);

//     //矩形
//     p.drawRect(300,300,150,150);


// }











